package com.guilin.system.service.impl;

import com.guilin.common.constant.Constants;
import com.guilin.common.core.domain.model.LoginUser;
import com.guilin.common.exception.user.DraftStatusErrorException;
import com.guilin.common.exception.user.NewsNotExistsException;
import com.guilin.common.exception.user.NewsPublishFailException;
import com.guilin.common.exception.user.WithdrawNewsException;
import com.guilin.common.utils.DateUtils;
import com.guilin.common.utils.SecurityUtils;
import com.guilin.domain.News;
import com.guilin.mapper.NewsMapper;
import com.guilin.system.service.NewsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 新闻发布Service业务层处理
 *
 * @author xiaoqi
 * @date 2025-06-18
 */
@Service
public class NewsServiceImpl implements NewsService {
    @Autowired
    private NewsMapper newsMapper;

    /**
     * 查询新闻发布
     *
     * @param id 新闻发布主键
     * @return 新闻发布
     */
    @Override
    public News selectNewsById(Long id) {
        return newsMapper.selectNewsById(id);
    }

    /**
     * 查询新闻发布列表
     *
     * @param news 新闻发布
     * @return 新闻发布
     */
    @Override
    public List<News> selectNewsList(News news) {
        return newsMapper.selectNewsList(news);
    }

    /**
     * 新增新闻发布
     *
     * @param news 新闻发布
     * @return 结果
     */
    @Override
    public int insertNews(News news) {

        // 1.获取当前登录用户的信息
        LoginUser loginUser = SecurityUtils.getLoginUser();

        // 2.获取当前登录用户的id
        Long userId = loginUser.getUserId();


        news.setPublishTime(DateUtils.getNowDate());
        news.setPublisherId(userId);
        news.setOperatorId(userId);
        news.setCreateTime(DateUtils.getNowDate());
        return newsMapper.insertNews(news);
    }

    /**
     * 修改新闻发布
     *
     * @param news 新闻发布
     * @return 结果
     */
    @Override
    public int updateNews(News news) {
        // 1.获取当前登录用户的信息
        LoginUser loginUser = SecurityUtils.getLoginUser();

        // 2.获取当前登录用户的id
        Long userId = loginUser.getUserId();


        news.setPublishTime(DateUtils.getNowDate());
        news.setPublisherId(userId);
        news.setOperatorId(userId);
        news.setUpdateTime(DateUtils.getNowDate());
        return newsMapper.updateNews(news);
    }

    /**
     * 批量删除新闻发布
     *
     * @param ids 需要删除的新闻发布主键
     * @return 结果
     */
    @Override
    public int deleteNewsByIds(Long[] ids) {
        return newsMapper.deleteNewsByIds(ids);
    }

    /**
     * 删除新闻发布信息
     *
     * @param id 新闻发布主键
     * @return 结果
     */
    @Override
    public int deleteNewsById(Long id) {
        return newsMapper.deleteNewsById(id);
    }


    /**
     * 发布新闻--修改状态为发布状态
     *
     * @param id
     */
    public void publishNews(Long id) {

        // 1.获取当前登录用户的信息
        LoginUser loginUser = SecurityUtils.getLoginUser();

        // 2.获取当前登录用户的id
        Long userId = loginUser.getUserId();

        // 3..根据新闻id查询新闻
        News news = newsMapper.selectNewsById(id);

        // 4.判断新闻是否存在
        if (news == null) {
            throw new NewsNotExistsException("新闻不存在，无法发布");
        }

        // 5.判断新闻是否为发布状态
        if (news.getStatus() != null && news.getStatus().equals(Constants.ONE)) {
            throw new DraftStatusErrorException("新闻处于发布中,无法再次发布");
        }

        // 6.修改新闻状态为发布状态
        news.setId(id);
        news.setStatus(Constants.ONE);
        news.setPublisherId(userId);
        news.setPublishTime(DateUtils.getNowDate());
        news.setOperatorId(userId);
        news.setUpdateTime(DateUtils.getNowDate());


        // 7.更新新闻
        if (newsMapper.updateNews(news) < 0) {
            throw new NewsPublishFailException("新闻发布失败");
        }
    }


    /**
     * 撤销新闻--修改发布状态为撤销新闻
     *
     * @param id
     */
    public void withdrawNews(Long id) {

        // 1.查询新闻
        News news = newsMapper.selectNewsById(id);

        // 2.判断新闻是否存在
        if (news == null) {
            throw new NewsNotExistsException("新闻不存在，无法撤回");
        }

        // 3.判断新闻是否为发布状态
        if (news.getStatus() != null && !news.getStatus().equals(Constants.ONE)) {
            throw new DraftStatusErrorException("新闻不是发布状态,无法撤回");
        }

        // 4.获取当前登录用户的信息
        LoginUser loginUser = SecurityUtils.getLoginUser();

        // 5.获取当前登录用户的id
        Long userId = loginUser.getUserId();

        // 6.修改新闻状态为撤销状态
        news.setId(id);
        news.setStatus(Constants.TWO);
        news.setWithdrawTime(DateUtils.getNowDate());
        news.setOperatorId(userId);
        news.setUpdateTime(DateUtils.getNowDate());

        // 7.更新新闻
        if (newsMapper.updateNews(news) < 0) {
            throw new WithdrawNewsException("新闻撤回失败");
        }
    }


    /**
     * 记录新闻浏览量
     *
     * @param id
     */
    public void updateViewCount(Long id) {

        // 1.查询新闻
        News news = newsMapper.selectNewsById(id);

        // 2.判断新闻是否存在
        if (news == null) {
            throw new NewsNotExistsException("新闻不存在，无法获取浏览");
        }

        // 3.更新新闻浏览量
        News viewCountUpdate = new News();
        viewCountUpdate.setId(id);
        viewCountUpdate.setViewCount(news.getViewCount() + 1);
        viewCountUpdate.setUpdateTime(DateUtils.getNowDate());

        int rows = newsMapper.viewCountUpdate(viewCountUpdate);

        if (rows < 0) {
            throw new NewsNotExistsException("新闻浏览量更新失败");
        }
    }
}
